﻿/**
 * @file NandBlockTracker.h
 * @brief NAND块页状态跟踪模块，记录页写入和损坏状态。
 */
#ifndef __NandBlockTracker_h__
#define __NandBlockTracker_h__

#include <memory>
#include "Nand/Types.h"

/**
 * @class NandBlockTracker
 * @brief 跟踪块内页写入和损坏状态。
 */
class NandBlockTracker
{
public:
    /**
     * @brief 构造函数，初始化页数。
     * @param pagesPerBlock 块内页数
     */
    NandBlockTracker(U32 pagesPerBlock);
    NandBlockTracker(NandBlockTracker &&rhs) = default;

    /**
     * @brief 重置所有页状态。
     */
    void Reset();
    /**
     * @brief 标记某页已写入。
     * @param page 页号
     */
    void WritePage(tPageInBlock page);
    /**
     * @brief 检查某页是否损坏。
     * @param page 页号
     * @return 是否损坏
     */
    bool IsPageCorrupted(tPageInBlock page);

private:
    /**
     * @brief 计算页状态位图大小。
     * @param papgesPerBlock 块内页数
     * @return 位图大小（字节）
     */
    constexpr U32 CalculatingBitmapSize(U32 papgesPerBlock)
    {
        return ((papgesPerBlock + (8 - 1)) / 8);
    }

    U32 _PagesPerBlock;                          /**< 块内页数 */
    U32 _BitmapSize;                             /**< 位图大小 */
    tPageInBlock _PageWrittenMarker;             /**< 已写入页标记 */
    std::unique_ptr<U8[]> _CorruptedPagesBitmap; /**< 损坏页位图 */
};

#endif
